package service

import (
	"fmt"
	"g_ansible/ansible/model"
	"g_ansible/utils"
)

type V2HostService struct {
}

func (b *V2HostService) Query() (model.Inventory, error) {
	inv, err := utils.LoadJson()
	if err != nil {
		return nil, err
	}
	return inv, nil
}

func (b *V2HostService) Add(newInv model.Inventory) error {
	inv, err := utils.LoadJson()
	if err != nil {
		// 处理错误
		return err
	}
	// 遍历新传入的Inventory
	for groupName, group := range newInv {
		// 检查主机组是否已存在
		existingGroup, groupExists := inv[groupName]
		// 如果主机组不存在，直接创建新的主机组
		if !groupExists {
			inv[groupName] = group
			continue
		}
		// 主机组存在，检查主机是否已存在
		for hostName, hostVars := range group.HostVars {
			// 检查主机是否已存在
			_, hostExists := existingGroup.HostVars[hostName]
			if hostExists {
				// 主机已存在，返回错误
				return fmt.Errorf("主机 %s 已存在", hostName)
			}
			// 主机不存在，添加新主机
			existingGroup.HostVars[hostName] = hostVars
			inv[groupName] = existingGroup
		}
	}
	// 保存到json文件
	err = utils.SaveJson(inv)
	if err != nil {
		return err
	}
	return nil
}

// Update 更新指定主机组中的主机信息
func (b *V2HostService) Update(groupName string, hostName string, hostVars model.HostVars) error {
	inv, err := utils.LoadJson()
	if err != nil {
		return err
	}

	// 检查主机组是否存在
	existingGroup, groupExists := inv[groupName]
	if !groupExists {
		return fmt.Errorf("主机组 %s 不存在", groupName)
	}

	// 检查主机是否存在
	_, hostExists := existingGroup.HostVars[hostName]
	if !hostExists {
		return fmt.Errorf("主机 %s 不存在", hostName)
	}

	// 更新主机信息
	existingGroup.HostVars[hostName] = hostVars
	inv[groupName] = existingGroup

	// 保存到json文件
	return utils.SaveJson(inv)
}

// Delete 删除指定主机组中的主机
func (b *V2HostService) Delete(groupName string, hostName string) error {
	inv, err := utils.LoadJson()
	if err != nil {
		return err
	}

	// 检查主机组是否存在
	existingGroup, groupExists := inv[groupName]
	if !groupExists {
		return fmt.Errorf("主机组 %s 不存在", groupName)
	}

	// 检查主机是否存在
	_, hostExists := existingGroup.HostVars[hostName]
	if !hostExists {
		return fmt.Errorf("主机 %s 不存在", hostName)
	}

	// 删除主机
	delete(existingGroup.HostVars, hostName)
	inv[groupName] = existingGroup

	// 如果主机组为空，也删除主机组
	if len(existingGroup.HostVars) == 0 {
		delete(inv, groupName)
	}

	// 保存到json文件
	return utils.SaveJson(inv)
}
